package string;

import org.junit.Test;

/**
 * @Description BM83 字符串变形  https://www.nowcoder.com/practice/c3120c1c1bc44ad986259c0cf0f0b80e?tpId=295&tqId=44664&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj
 * @Author Firenut
 * @Date 2023-02-16 22:08
 * 这个题意有点误导人，我理清了一下: 大概就是要让你把字符串反转，然后把每一个单词反转为原来的顺序(空格不要动)
 * 比如："I H " 反转后的结果就是 " H I"
 * 感觉函数里的参数n其实不用传，感觉有点多余了，因为可以直接通过s.length()得到...
 * 这个题的反转区别于: T58_I_reverseWords:  https://leetcode.cn/problems/fan-zhuan-dan-ci-shun-xu-lcof/
 */
public class trans {
    @Test
    public void test() {
        System.out.println(trans("h i ", 4));  // "I H "
//        System.out.println(trans("h i ", 4));  //  ” i h “  ->  " I H "
        // "I H "  ->
    }

    public String trans(String s, int n) {
        StringBuffer sb = new StringBuffer(s);
        StringBuffer res = new StringBuffer();
        // 先反转整个字符串
        sb = sb.reverse();

        // 将每个单词反转回来
        String temp = reverseWords(sb.toString());

        // 将大写转小写,小写转大写
        for (int i = 0; i < temp.length(); i++) {
            char ch = temp.charAt(i);
            if (ch >= 'a' && ch <= 'z') {
                res.append((char) ('A' + ch - 'a'));
            } else if (ch >= 'A' && ch <= 'Z') {
                res.append((char) ('a' + ch - 'A'));
            } else {
                res.append(' ');
            }
        }
        return res.toString();
    }

    // 反转单词
    private String reverseWords(String s) {
        StringBuilder ans = new StringBuilder(s);
        for (int i = 0; i < s.length(); i++) {
            int j = i;
            while (j < s.length() && s.charAt(j) != ' ') { //如果一开始是空格,那么不会反转,进入下一轮外循环
                j++;
            }
            // 说实话这块感觉很麻烦...感觉有点啰嗦
            String temp = s.substring(i, j);     // 截取单词
            StringBuilder sb = new StringBuilder(temp);
            String s1 = sb.reverse().toString(); // 反转单词
            ans.replace(i, j, s1);
            i = j;
        }
        return ans.toString();
    }
}

// 对于字符串的每个单词不需要反转,各单词之间需要反转
// 小写转大写,大写转小写
/*
    public String trans(String s, int n) {
        String temp = reverseWords(s);
        StringBuffer sb = new StringBuffer();

        // 将大写转小写,小写转大写
        for (int i = 0; i < temp.length(); i++) {
            char ch = temp.charAt(i);
            if (ch >= 'a' && ch <= 'z') {
                sb.append((char) ('A' + ch - 'a'));
            } else if (ch >= 'A' && ch <= 'Z') {
                sb.append((char) ('a' + ch - 'A'));
            } else {
                sb.append(' ');
            }
        }
        return sb.toString();
    }
*/

// 注意最后一个字符为空格的情况(主要是理解它的题意，这个单词反转不能直接这么做，会把空格丢失掉或者多出空格)
/*
    public String reverseWords(String s) {
        // 去掉字符串前后的空格
        // 使用双指针逆序遍历,从而将各单词倒转
        // s=s.trim();
        StringBuffer sb = new StringBuffer();
        int i, j;
        i = j = s.length() - 1;
        while (i >= 0) {
            while (i >= 0 && s.charAt(i) != ' ') {  // i>=0 防止越界
                i--;
            }
            sb.append(s.substring(i + 1, j + 1)).append(" ");
            while (i >= 0 && s.charAt(i) == ' ') {
                i--;
            }
            j = i;
        }

        return sb.toString().trim();
    }
*/
